#include <iostream>
#include <vector>
#include <string>
#include <thread>
#include <sw/redis++/redis++.h>

using namespace std;
using namespace sw::redis;
using namespace std::chrono_literals;

void test1(Redis& redis)
{
    cout << "using lpush and lrange" << endl;

    redis.lpush("key1", "111");

    redis.lpush("key1", {"222", "333", "444"});

    vector<string> values = {"555", "666", "777"};
    redis.lpush("key1", values.begin(), values.end());

    vector<string> result;
    auto it = back_inserter(result);
    redis.lrange("key1", 0, -1, it);

    for(auto& str : result)
        cout << str << endl;
}

void test2(Redis& redis)
{
    cout << "using rpush" << endl;
    redis.lpush("key1", "111");

    redis.rpush("key1", {"222", "333", "444"});

    vector<string> values = {"555", "666", "777"};
    redis.rpush("key1", values.begin(), values.end());

    vector<string> result;
    auto it = back_inserter(result);
    redis.lrange("key1", 0, -1, it);

    for(auto& str : result)
        cout << str << endl;
}

void test3(Redis& redis)
{
    cout << "using lpop and rpop" << endl;
    redis.rpush("key", {"111", "222", "333"});

    auto ret = redis.rpop("key");
    if(ret) cout << ret.value() << endl;

    ret = redis.lpop("key");
    if(ret) cout << ret.value() << endl;

    vector<string> result;
    auto it = back_inserter(result);
    redis.lrange("key", 0, -1, it);

    for(auto& str : result)
        cout << str << endl;
}

void test4(Redis& redis)
{
    cout << "using llen" << endl;

    redis.rpush("key", {"111", "222", "333"});

    auto result = redis.llen("key");
    cout << result << endl;
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    test4(redis);
    redis.flushall();
    return 0;
}